package com.itany.corejava.code08_常用类.内部类;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年11月16日 16:04
 */
public class Test01_成员内部类 {

    public static void main(String[] args) {
        Outer outer = new Outer("alice", 20);
        outer.show();

        //在非外部类实例化内部类
        // 语法:外部类.内部类 变量名 = 外部类对象.new 内部类()
        Outer.Inner inner = outer.new Inner();
        inner.print();
        System.out.println(inner.getName());


    }


}

//外部类
class Outer {
    private String name = "admin";
    private int age = 20;

    public Outer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void show() {
        System.out.println("这是外部类的方法");
        Inner inner = new Inner();//在外部类中正常实例化内部类即可
        System.out.println(inner.getName());
        System.out.println(inner.name);
        System.out.println(inner.gender);
        System.out.println(name);//访问外部类的属性
        inner.print();

    }

    //定义成员内部类
    class Inner {
        private String name = "aa";
        private String gender;

        public Inner() {
        }

        public Inner(String name, String gender) {
            this.name = name;
            this.gender = gender;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getGender() {
            return gender;
        }

        public void setGender(String gender) {
            this.gender = gender;
        }

        public void print() {
            System.out.println("--------------这是内部类的方法----------");

            // 在内部类中，对于与外部类同名的时候，默认访问的是内部类的属性名
            // 可以通过外部类.this.属性名或者外部类.this.方法名():表示在内部类中调用外部类的某个属性
            // 可以通过外部类的实例.属性名或者.方法名()


            System.out.println("外部类的age：" + age);
            System.out.println("内部类的name：" + name);

            //外部类.this.属性名:表示在内部类中调用外部类的某个属性
            System.out.println("外部类的name：" + Outer.this.name);


            Outer outer = new Outer("huahua", 20);
            System.out.println(outer.name);

        }
    }


}